#ifndef HEAD_H
#define HEAD_H
// #include <windows.h>
// 创建消息列表数据动态数组
#include <string>
#include <cstring>
#include <QMouseEvent>
#include <QDir>
#include <QDebug>
#include <Qpen> // 画笔
#include <QPoint>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout> //垂直布局类
#include <QHBoxLayout> // 水平布局类
#include <QLabel>
#include <QLineEdit>   // 行 文本编辑框
#include <QMessageBox> // 弹窗类
#include <QBoxLayout>
#include <QPixmap>         //pixmap 图片
#include <QListWidget>     // 列表控件
#include <QListWidgetItem> // 列表控件
#include <QWidget>         // 窗口控件
#include <QScrollArea>     // 滚动控件
#include <QTextEdit>       // 文本编辑控件
#include ".\components\tcp\tcp.h"

extern int MessageListActiveIndex; // 消息列表激活索引
constexpr int QT_WIDTH = 700;
constexpr int QT_HEIGHT = 537;
constexpr int QT_SIDEBAR_WIDTH = 57;                   // 侧边栏宽
constexpr int QT_MESSAGELIST_WIDTH = 225;              // 消息列表宽
constexpr int QT_MESSAGELIST_SEARCH_HEIGHT = 62;       // 消息列表搜索模块高
constexpr int QT_MESSAGELIST_ITEM_HEIGHT = 65;         // 消息列表搜索模块高
constexpr int QT_CHATWINDOWS_WIDTH = 420;              // 聊天窗口宽
constexpr int QT_CHATWINDOWS_WINDOW_HEIGHT = 295;      // 聊天窗口高
constexpr int QT_CHATWINDOWS_TITLE_HEIGHT = 62;        // 聊天窗口标题模块高
constexpr int QT_CHATWINDOWS_TOOL_HEIGHT = 40;         // 聊天工具模块高
constexpr int QT_CHATWINDOWS_INPUT_HEIGHT = 85;        // 聊天输入模块高
constexpr int QT_CHATWINDOWS_SENDBTN_LEFT_WIDTH = 290; // 聊天输入模块高
extern QString accountValue;
extern QString passwordValue;
// 定义全局tcp类对象
extern tcp *tcpFn;

using namespace std; // 使用标准库
// 当前页面 1为登录页，2为首页,3为注册页,4忘记密码
extern int pageType;
extern int uid;                // 用户ID
extern int headImgType;        // 头像类型
extern QString userName;       // userName
extern QString niceName;       // 真实姓名
extern int sex;                // 用户性别
extern QString charInputValue; // 发送的消息

/**
 * @brief 微信消息结构体，用于存储微信消息的相关信息
 */
typedef struct messageListStruct
{
    int url;            // 消息URL
    int total;          // 消息总数
    int isActive;       // 消息是否激活
    int isGroup;        // 是否为群组消息
    int Id;             // 消息ID
    int isGroupMessage; // 是否为群组消息
    int isRead;         // 消息是否已读
    int groupId;        // 群组ID
    int userId;         // 用户ID
    char groupName[64]; // 群组名称
    char userName[64];  // 用户名
    char message[256];  // 消息内容
    time_t timestamp;   // 消息时间戳

    // 构造函数
    messageListStruct(int url, int total, int isActive, int isGroup, int Id, int isGroupMessage, int isRead, int groupId, int userId, const char *groupName, const char *userName, const char *message, time_t timestamp)
    {
        this->url = url;
        this->total = total;
        this->isActive = isActive;
        this->isGroup = isGroup;
        this->Id = Id;
        this->isGroupMessage = isGroupMessage;
        this->isRead = isRead;
        this->groupId = groupId;
        this->userId = userId;
        strncpy(this->groupName, groupName, sizeof(this->groupName) - 1);
        strncpy(this->userName, userName, sizeof(this->userName) - 1);
        strncpy(this->message, message, sizeof(this->message) - 1);
        this->timestamp = timestamp;
    }
} messageListStruct, *pmessageListStruct;

/**
 * @brief 微信结构体，用于存储微信的相关信息
 */
typedef struct chatWindowListStruct
{
    int url;            // 微信URL
    int total;          // 微信总数
    int weCharId;       // 微信ID
    int GroupId;        // 群组ID
    int friendId;       // 好友ID
    int userId;         // 用户ID
    int sex;            // 性别
    int messageType;    // 消息类型 1普通 2文件
    char userName[64];  // 用户名
    char niceName[64];  // 昵称
    char message[1024]; // 消息内容
    char format[20];    // 文件名
    time_t timestamp;   // 时间戳
    // 写一个构造函数
    chatWindowListStruct(int url, int total, int weCharId, int GroupId, int friendId, int userId, int sex, int messageType, const char *userName, const char *niceName, const char *message, const char *format, time_t timestamp)
    {
        this->url = url;
        this->total = total;
        this->weCharId = weCharId;
        this->GroupId = GroupId;
        this->friendId = friendId;
        this->userId = userId;
        this->sex = sex;
        this->messageType = messageType;
        strncpy(this->userName, userName, sizeof(this->userName) - 1);
        strncpy(this->niceName, niceName, sizeof(this->niceName) - 1);
        strncpy(this->message, message, sizeof(this->message) - 1);
        strncpy(this->format, format, sizeof(this->format) - 1);
        this->timestamp = timestamp;
    }

} chatWindowListStruct, *pchatWindowListStruct;
typedef struct
{
    int code;
    char message[100];
    char data1[100];
    char data2[100];
    char data3[100];
    char data4[100];
} QueryResult;
QueryResult parseQueryParams(const char *query);
char **splitStringByDelimiter(const char *input, int *count);
messageListStruct parseResponse(const char *query);
chatWindowListStruct parseCharResponse(const char *query);
char **splitStringCorrect(const char *str, const char delim, int *arrayLength);
extern vector<messageListStruct> messageListDatas;
// 创建消息列表数据动态数组
extern vector<chatWindowListStruct> chatWindowListDatas;

#endif // HEAD_H
